package controle;

import excecao.CursoPossuiDisciplinasException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.model.ListDataModel;
import modelo.Curso;
import modelo.CursoDisciplina;
import service.CursoDisciplinaService;
import service.CursoService;
import util.FabricaDeObjetos;

/**
 *
 * @author Jorge
 */
public class CursoMB extends BaseMB {

    private CursoService cursoService;
    private CursoDisciplinaService cursoDisciplinaService;
    private Curso cursoCorrente;
    private List<Curso> lista;
    private ListDataModel listaDataModel;


    public CursoMB() {
        try {
            cursoService = (CursoService) FabricaDeObjetos.getObjetoUnico(CursoService.class);
            cursoDisciplinaService = (CursoDisciplinaService) FabricaDeObjetos.getObjetoUnico(CursoDisciplinaService.class);
        } catch (Exception ex) {
            Logger.getLogger(CursoMB.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public String exibirTodos() {
        lista = cursoService.getTodos();
        listaDataModel = new ListDataModel(lista);
        
        return "exibirTodos";
    }

    public String exibirTodosPorAluno() {
        lista = cursoService.getTodos();
        listaDataModel = new ListDataModel(lista);

        return "exibirTodosPorAluno";
    }
    
    //Método auxiliar
    private void getDisciplinas() {
        List<CursoDisciplina> cursoDisciplina = cursoDisciplinaService.getPorCurso(cursoCorrente);

        listaDataModel = new ListDataModel(cursoDisciplina);
    }

    public String exibirDiscPelaExibirTodos() {
        cursoCorrente = (Curso) listaDataModel.getRowData();
        getDisciplinas();
        
        return "exibirDisciplinas";
    }

    public String exibirDiscPelaBusca() {
        getDisciplinas();
        
        return "exibirDisciplinas";
    }
    
    public String buscar() {
        cursoCorrente = new Curso();

        return "buscarCurso";
    }
    
    public String buscaPorId() {
        cursoCorrente = cursoService.getPorId(cursoCorrente.getId());
        List listaCurso = new ArrayList();

        if (cursoCorrente != null) {
            listaCurso.add(cursoCorrente);
        }

        listaDataModel = new ListDataModel(listaCurso);

        return "exibirTodos";
    }

    public String buscaPorNome() {
        lista = cursoService.getPorNome(cursoCorrente.getNome());
        listaDataModel = new ListDataModel(lista);

        return "exibirTodos";
    }

    public String cadastrar() {
        cursoCorrente = new Curso();

        return "cadastrarCurso";
    }

    public String salvar() {
        cursoService.inserir(cursoCorrente);

        return "cursoSalvar";
    }
    
    public String editar() {
        cursoCorrente = (Curso) listaDataModel.getRowData();

        return "editarCurso";
    }

    public String editarPelaBusca() {
        return "editarCurso";
    }
    
    public String salvarEdicao() {
        //Tenta editar o curso
        //Verificando se o mesmo não possui disciplinas vinculadas
        try {
             cursoService.alterar(cursoCorrente);
        } catch (CursoPossuiDisciplinasException ex) {
            this.error(ex.getMessage());

            return "cursoEdicaoNaoSalva";
        }
        
        this.info("Curso editado com sucesso!");

        return "cursoEdicaoSalva";
    }
    
    //Método auxiliar
    private String excluir() {
        //Tenta remover o curso
        //Verificando se o mesmo não possui disciplinas vinculadas
        try {
            cursoService.remover(cursoCorrente);
        } catch (CursoPossuiDisciplinasException ex) {
            this.error(ex.getMessage());

            return "cursoNaoExcluido";
        }

        this.info("Curso excluido com sucesso!");

        return "cursoExcluido";
    }

    public String excluirPelaExibirTodos() {
        cursoCorrente = (Curso) listaDataModel.getRowData();

        return excluir();
    }

    public String excluirPelaBusca() {
        return excluir();
    }
    
    public String voltar() {
        cursoCorrente = new Curso();

        return "voltar";
    }

    public String voltarAluno() {
        cursoCorrente = new Curso();

        return "voltarAluno";
    }

    public String voltarBusca() {
        cursoCorrente = new Curso();

        return "voltarBusca";
    }

    public String voltarExibirTodos() {
        cursoCorrente = new Curso();

        return "voltarExibirTodos";
    }
    
    public Curso getCursoCorrente() {
        return cursoCorrente;
    }

    public void setCursoCorrente(Curso cursoCorrente) {
        this.cursoCorrente = cursoCorrente;
    }

    public CursoService getCursoService() {
        return cursoService;
    }

    public void setCursoService(CursoService cursoService) {
        this.cursoService = cursoService;
    }

    public List<Curso> getLista() {
        return lista;
    }

    public void setLista(List<Curso> lista) {
        this.lista = lista;
    }

    public ListDataModel getListaDataModel() {
        return listaDataModel;
    }

    public void setListaDataModel(ListDataModel listaDataModel) {
        this.listaDataModel = listaDataModel;
    }
}
